package com.atguigu.gulimall.seckill.scheduled;

import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;

/**
 * 定时任务
 *      1、@EnableScheduleing 开启定时任务
 *      2、@Scheduled 开启一个定时任我游
 *      3、自动配置类 TaskSchedulingAutoConfiguration
 *      属性绑定在  TaskSchedulingProperties  默认只有一个线程大小 spring.task.scheduling.pool.size = 1
 *
 *  异步任务
 *      1、@EnableAsync 开启异步任务功能
 *      2、@Async 给希望异步执行的方法上标注
 *      3、自动配置类 TaskExecutionAutoConfiguration 属性绑定在 TaskExecutionProperties
 *
 */
@Slf4j
@Component
//@EnableScheduling
//@EnableAsync
public class HelloScheduled {

    /**
     * 1、Spring中cron表达式由6位组成，不允许第7位的年
     * 2、在周几的位置，1-7代表周一到周日；  也可以用 MON-SUN 表示
     * 3、定时任务不应该是阻塞的。默认是阻塞的。
     *      阻塞的意思是：定时任务执行时  定时到了就应该再执行一次任务，但是现在要等到上一个任务执行完才能执行下一个定时任务
     *
     *     解决方法：
     *          1）、可以让业务运行以异步的方式，自己提交到线程池
     *              CompletableFuture.runAsync(() -> {
     *                  xxxxService.hello();
     *              },executor);
     *          2）、支持定时任务线程池的设置；  设置TaskSchedulingProperties;
     *              spring.task.scheduling.pool.size=5
     *              有bug，在个别版本内会失效
     *          3）、让定时任务异步执行
     *              异步任务；
     *
     *         最终选择：使用异步+定时任务来完成定时任务不阻塞的功能
     * @throws InterruptedException
     */
    @Async
//    @Scheduled(cron = "*/1 * * ? * 7")
    public void hello() throws InterruptedException {
        /*CompletableFuture.runAsync(() -> {
            log.info("hello============");
            try {
                TimeUnit.SECONDS.sleep(2);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });*/
        log.info("hello============");
        TimeUnit.SECONDS.sleep(2);
    }
}


